package com.chq.version.util;

import java.io.*;
import java.net.URISyntaxException;
import java.util.*;

/**
 * Created by CHQIU on 2017-01-13.
 */
public class PropertiesUtil {

    /**
     * 通过类加载目录getClassLoader()加载属性文件
     *
     * @param path 配置文件名称，不带后缀名
     * @param key  属性名称
     * @return value 值
     */
    public static String getPropertyByName(String path, String key) {
        String result = "";
        Properties prop = getProperties(path);
        result = prop.getProperty(key).trim();
        return result;
    }

    public static Properties getProperties(String path) {
        // 通过类加载目录getClassLoader()加载属性文件
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(path + ".properties"));
        } catch (NullPointerException npe) {
            System.err.println("未查找到该属性" + npe.getMessage());
        } catch (IOException ioe) {
            System.err.println("读取配置文件出错!" + ioe.getMessage());
        }
        return prop;
    }


    /**
     * 修改系统参数
     *
     * @param path  配置文件名称，不带后缀名
     * @param key   属性名称
     * @param value 值
     */
    public static void setPropertyByName(String path, String key, String value) {
        Properties prop = new Properties();
        InputStream fis = null;
        OutputStream fos = null;
        path = path + ".properties";
        try {
            java.net.URL url = PropertiesUtil.class.getClassLoader()
                    .getResource(path);
            File file = new File(url.toURI());
            if (!file.exists()){
                file.createNewFile();
            }
            fis = new FileInputStream(file);
            prop.load(fis);
            fis.close();// 一定要在修改值之前关闭fis
            fos = new FileOutputStream(file);
            prop.setProperty(key, value);
            prop.store(fos, "更新'" + key + "'值");
            fos.close();

        } catch (IOException e) {
            System.err.println("Visit " + path + " for updating " + value
                    + " value error");
        } catch (URISyntaxException use) {
            System.err.println(use.getMessage());
        } finally {
            try {
                if (fos != null){
                    fos.close();
                }
                if (fis != null){
                    fis.close();
                }
            } catch (IOException ioe) {
                System.err.println(ioe.getMessage());
            }
        }
    }

    /**
     * 获取指定配置文件中所以的数据，只能加载类classes下面的资源文件且只能读取.properties文件
     *
     * @param propertyName 调用方式：
     *                     1.配置文件放在resource源包下，不用加后缀
     *                     PropertiesUtil.getAllMessage("message");
     *                     2.放在包里面的
     *                     PropertiesUtil.getAllMessage("com.test.message");
     * @return
     */
    public static List<String> getAllMessage(String propertyName) {
        // 获得资源包
        ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
        // 通过资源包拿到所有的key
        Enumeration<String> allKey = rb.getKeys();
        // 遍历key 得到 value
        List<String> valList = new ArrayList<String>();
        while (allKey.hasMoreElements()) {
            String key = allKey.nextElement();
            String value = (String) rb.getString(key);
            valList.add(value);
        }
        return valList;
    }

    /**
     * 获取指定配置文件中所以的数据，只能加载类classes下面的资源文件且只能读取.properties文件
     *
     * @param propertyName 调用方式：
     *                     1.配置文件放在resource源包下，不用加后缀
     *                     PropertiesUtil.getAllMessage("message");
     *                     2.放在包里面的
     *                     PropertiesUtil.getAllMessage("com.test.message");
     * @return
     */
    public static Map<String, String> getMap(String propertyName) {
        Map<String, String> map = new HashMap<String, String>();
        // 获得资源包
        ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
        // 通过资源包拿到所有的key
        Enumeration<String> allKey = rb.getKeys();
        // 遍历key 得到 value
        List<String> valList = new ArrayList<String>();
        while (allKey.hasMoreElements()) {
            String key = allKey.nextElement();
            String value = rb.getString(key);
            map.put(key, value);
            valList.add(value);
        }
        return map;
    }
}
